/*
 * style_item.cpp
 *
 *  Created on: 03.07.2012
 *      Author: Caffeine
 */

#include "style_item.h"
#include "style.h"
#include "../CXMLFactoryEnvironment.h"
#include <lampe/xml/IFactoryRecord.h>
#include <lampe/xml/IXmlNode.h>


class StyleItemFactoryRecord:public lampe::xml::IFactoryRecord{
private:
	lampe::xml::StyleFactoryRecord*styleFactory;
public:

	StyleItemFactoryRecord(lampe::xml::StyleFactoryRecord*sf){
		styleFactory=sf;
	}

	/***
	 * Возвращяет все обрабатываемые узлы
	 *
	 * @return массив из строк названий узлов, которые обрабатывает данный обработчик
	 * */
	virtual LAMPE_VECTOR_VENDOR<lampe::String> getProcessedTags(){
		LAMPE_VECTOR_VENDOR<lampe::String> res;
		res.push_back("style:item");
		printf("reg style-item\n");
		return res;
	};
	
	/***
	 * Обработчик XML узла. Вызывается XML средой как только нахоидт указанный узел
	 *
	 * @param environment XML среда
	 * @param node обрабатываемый узел
	 * @return результат выполнения
	 * */
	virtual lampe::xml::TagResult tagHandlerBefor(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node){
		printf("TAG style-item!!!\n");
		if (!node->getParent()){
			return lampe::xml::STOP;
		}

		if (!node->getParent()->getTag()){
			//node->getParent()->removeNode(node);
			return lampe::xml::NEXT;
		}
		if (node->getNodeCount()!=1){
			//node->getParent()->removeNode(node);
			return lampe::xml::NEXT;
		}
		void*item=node->getParent()->getTag();
		printf("add style %s\n",node->getAttString("name").c_str());
		styleFactory->addStyleRecord(item,node->getAttString("name"),node->getNode(0)->toXML());

		return lampe::xml::BACK;
	}
	
	/***
	 * Обработчик XML узла. Вызывается XML средой после того как обработанны все вложенные узлы
	 *
	 * @param environment XML среда
	 * @param node обрабатываемый узел
	 * @return результат выполнения
	 * */
	virtual lampe::xml::TagResult tagHandlerAfter(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node){
		node->setParent(0);
		return lampe::xml::BACK;
	}
};

void regStyleItem(lampe::xml::CXMLFactoryEnvironment*environment,lampe::xml::StyleFactoryRecord*styleFactory){
	StyleItemFactoryRecord*temp=new StyleItemFactoryRecord(styleFactory);
	environment->registerHandler(temp);
	temp->drop();
}
